/**
 * 解决 react / vue 的 input 赋值
 * // @require https://gitee.com/uaufdh/tm/raw/master/js/common/set-value.js
 * 调用 setInputValue(tag, 'value');
 * @author: wj
 * @since: 2020-03-13 16:55
 */

/**
 *
 * @param element    dom 元素
 * @param value   输入域的值
 */
function setInputValue(element, value) {

    if (!element || !value) {
        console.log(`元素 = ${element}, value = ${value}, 无法 setInputValue ...`)
        return
    }

    setNativeValue(element, value)
    element.dispatchEvent(new Event('input', {bubbles: true}))
}

// react / vue 中 修改 input 是无效的
// https://github.com/facebook/react/issues/10135
function setNativeValue(element, value) {

    const {set: valueSetter} = Object.getOwnPropertyDescriptor(element, 'value') || {}
    const prototype = Object.getPrototypeOf(element)
    const {set: prototypeValueSetter} = Object.getOwnPropertyDescriptor(prototype, 'value') || {}

    if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
        prototypeValueSetter.call(element, value)
    } else if (valueSetter) {
        valueSetter.call(element, value)

        // 非 react 模式的, 直接赋值
    } else {
        element.value = value
        // throw new Error('The given element does not have a value setter')
    }
}